using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Attributes.DomainAttributes;
using Baci.Net.ToolKit.ArcGISProGeoprocessor.Models.Enums;
using System.Collections.Generic;
using System.ComponentModel;

namespace Baci.ArcGIS._ImageAnalystTools._MultidimensionalAnalysis
{
    /// <summary>
    /// <para>Predict Using Trend Raster</para>
    /// <para>Computes a forecasted multidimensional raster using the output trend raster from the Generate Trend Raster tool.</para>
    /// <para>使用生成趋势栅格工具的输出趋势栅格计算预测的多维栅格。</para>
    /// </summary>    
    [DisplayName("Predict Using Trend Raster")]
    public class PredictUsingTrendRaster : AbstractGPProcess
    {
        /// <summary>
        /// 无参构造
        /// </summary>
        public PredictUsingTrendRaster()
        {

        }

        /// <summary>
        /// 有参构造
        /// </summary>
        /// <param name="_in_multidimensional_raster">
        /// <para>Input Trend Raster</para>
        /// <para>The input multidimensional trend raster from the Generate Trend Raster tool.</para>
        /// <para>生成趋势栅格工具的输入多维趋势栅格。</para>
        /// </param>
        /// <param name="_out_multidimensional_raster">
        /// <para>Output Multidimensional Raster</para>
        /// <para>The output Cloud Raster Format (CRF) multidimensional raster dataset.</para>
        /// <para>输出云栅格格式 （CRF） 多维栅格数据集。</para>
        /// </param>
        public PredictUsingTrendRaster(object _in_multidimensional_raster, object _out_multidimensional_raster)
        {
            this._in_multidimensional_raster = _in_multidimensional_raster;
            this._out_multidimensional_raster = _out_multidimensional_raster;
        }
        public override string ToolboxName => "Image Analyst Tools";

        public override string ToolName => "Predict Using Trend Raster";

        public override string CallName => "ia.PredictUsingTrendRaster";

        public override List<string> AcceptEnvironments => ["cellSize", "compression", "configKeyword", "extent", "geographicTransformations", "nodata", "outputCoordinateSystem", "parallelProcessingFactor", "pyramid", "rasterStatistics", "resamplingMethod", "scratchWorkspace", "snapRaster", "tileSize", "workspace"];

        public override object[] ParameterInfo => [_in_multidimensional_raster, _out_multidimensional_raster, _variables, _dimension_def.GetGPValue(), _dimension_values, _start, _end, _interval_value, _interval_unit.GetGPValue()];

        /// <summary>
        /// <para>Input Trend Raster</para>
        /// <para>The input multidimensional trend raster from the Generate Trend Raster tool.</para>
        /// <para>生成趋势栅格工具的输入多维趋势栅格。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Input Trend Raster")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _in_multidimensional_raster { get; set; }


        /// <summary>
        /// <para>Output Multidimensional Raster</para>
        /// <para>The output Cloud Raster Format (CRF) multidimensional raster dataset.</para>
        /// <para>输出云栅格格式 （CRF） 多维栅格数据集。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Output Multidimensional Raster")]
        [Description("")]
        [Option(OptionTypeEnum.Must)]
        public object _out_multidimensional_raster { get; set; }


        /// <summary>
        /// <para>Variables [Dimension Info] (Description)</para>
        /// <para>The variable or variables that will be predicted in the analysis. If no variables are specified, all variables will be used.</para>
        /// <para>将在分析中预测的一个或多个变量。如果未指定任何变量，则将使用所有变量。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Variables [Dimension Info] (Description)")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public List<object> _variables { get; set; } = null;


        /// <summary>
        /// <para>Dimension Definition</para>
        /// <para><xdoc>
        ///   <para>Specifies the method used to provide prediction dimension values.</para>
        ///   <bulletList>
        ///     <bullet_item>By value—The prediction will be calculated for a single dimension value or a list of dimension values defined by the Values parameter (dimension_values in Python). This is the default.For example, you want to predict yearly precipitation for the years 2050, 2100, and 2150.</bullet_item><para/>
        ///     <bullet_item>By interval—The prediction will be calculated for an interval of the dimension defined by a start and an end value.For example, you want to predict yearly precipitation for every year between 2050 and 2150.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定用于提供预测维度值的方法。</para>
        ///   <bulletList>
        ///     <bullet_item>按值 - 将针对单个维度值或由 Values 参数（在 Python 中为 dimension_values）定义的维度值列表计算预测。这是默认设置。例如，您要预测 2050、2100 和 2150 年的年降水量。</bullet_item><para/>
        ///     <bullet_item>按间隔—将针对由起始值和结束值定义的维度间隔计算预测。例如，您要预测 2050 年至 2150 年间每年的年降水量。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Dimension Definition")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _dimension_def_value _dimension_def { get; set; } = _dimension_def_value._BY_VALUE;

        public enum _dimension_def_value
        {
            /// <summary>
            /// <para>By value</para>
            /// <para>By value—The prediction will be calculated for a single dimension value or a list of dimension values defined by the Values parameter (dimension_values in Python). This is the default.For example, you want to predict yearly precipitation for the years 2050, 2100, and 2150.</para>
            /// <para>按值 - 将针对单个维度值或由 Values 参数（在 Python 中为 dimension_values）定义的维度值列表计算预测。这是默认设置。例如，您要预测 2050、2100 和 2150 年的年降水量。</para>
            /// </summary>
            [Description("By value")]
            [GPEnumValue("BY_VALUE")]
            _BY_VALUE,

            /// <summary>
            /// <para>By interval</para>
            /// <para>By interval—The prediction will be calculated for an interval of the dimension defined by a start and an end value.For example, you want to predict yearly precipitation for every year between 2050 and 2150.</para>
            /// <para>按间隔—将针对由起始值和结束值定义的维度间隔计算预测。例如，您要预测 2050 年至 2150 年间每年的年降水量。</para>
            /// </summary>
            [Description("By interval")]
            [GPEnumValue("BY_INTERVAL")]
            _BY_INTERVAL,

        }

        /// <summary>
        /// <para>Values</para>
        /// <para><xdoc>
        ///   <para>The dimension value or values to be used in the prediction.</para>
        ///   <para>The format of the time, depth, and height values must match the format of the dimension values used to generate the trend raster. If the trend raster was generated for the StdTime dimension, the format would be YYYY-MM-DDTHH:MM:SS, for example 2050-01-01T00:00:00. Multiple values are separated with a semicolon.</para>
        ///   <para>This parameter is required when the Dimension Definition parameter is set to By value.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>要在预测中使用的一个或多个维度值。</para>
        ///   <para>时间、深度和高度值的格式必须与用于生成趋势栅格的维度值的格式匹配。如果为 StdTime 维度生成趋势栅格，则格式为 YYYY-MM-DDTHH：MM：SS，例如 2050-01-01T00：00：00。多个值用分号分隔。</para>
        ///   <para>当“维度定义”参数设置为“按值”时，此参数是必需的。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Values")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public List<object> _dimension_values { get; set; } = null;


        /// <summary>
        /// <para>Start</para>
        /// <para>The start date, height, or depth of the dimension interval to be used in the prediction.</para>
        /// <para>要在预测中使用的维度间隔的开始日期、高度或深度。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("Start")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _start { get; set; } = null;


        /// <summary>
        /// <para>End</para>
        /// <para>The end date, height, or depth of the dimension interval to be used in the prediction.</para>
        /// <para>要在预测中使用的维度间隔的结束日期、高度或深度。</para>
        /// <para></para>
        /// </summary>
        [DisplayName("End")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public object _end { get; set; } = null;


        /// <summary>
        /// <para>Value Interval</para>
        /// <para><xdoc>
        ///   <para>The number of steps between two dimension values to be included in the prediction. The default value is 1.</para>
        ///   <para>For example, to predict temperature values every five years, use a value of 5.</para>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>要包含在预测中的两个维度值之间的步数。默认值为 1。</para>
        ///   <para>例如，若要每五年预测一次温度值，请使用值 5。</para>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Value Interval")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public double? _interval_value { get; set; } = null;


        /// <summary>
        /// <para>Unit</para>
        /// <para><xdoc>
        ///   <para>Specifies the unit that will be used for the interval value. This parameter only applies when the dimension of analysis is a time dimension.</para>
        ///   <bulletList>
        ///     <bullet_item>Hours—The prediction will be calculated for each hour in the range of time described by the Start, End, and Value Interval parameters.</bullet_item><para/>
        ///     <bullet_item>Days—The prediction will be calculated for each day in the range of time described by the Start, End, and Value Interval parameters.</bullet_item><para/>
        ///     <bullet_item>Weeks—The prediction will be calculated for each week in the range of time described by the Start, End, and Value Interval parameters.</bullet_item><para/>
        ///     <bullet_item>Months—The prediction will be calculated for each month in the range of time described by the Start, End, and Value Interval parameters.</bullet_item><para/>
        ///     <bullet_item>Years—The prediction will be calculated for each year in the range of time described by the Start, End, and Value Interval parameters.</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para><xdoc>
        ///   <para>指定将用于间隔值的单位。仅当分析维度为时间维度时，此参数才适用。</para>
        ///   <bulletList>
        ///     <bullet_item>小时—将在“开始”、“结束”和“值间隔”参数描述的时间范围内计算每个小时的预测。</bullet_item><para/>
        ///     <bullet_item>天数—将在开始、结束和值间隔参数描述的时间范围内计算每天的预测。</bullet_item><para/>
        ///     <bullet_item>周—将在开始、结束和值间隔参数描述的时间范围内计算每周的预测。</bullet_item><para/>
        ///     <bullet_item>月—将在开始、结束和值间隔参数描述的时间范围内计算每个月的预测。</bullet_item><para/>
        ///     <bullet_item>年—将在开始、结束和值间隔参数描述的时间范围内计算每年的预测。</bullet_item><para/>
        ///   </bulletList>
        /// </xdoc></para>
        /// <para></para>
        /// </summary>
        [DisplayName("Unit")]
        [Description("")]
        [Option(OptionTypeEnum.optional)]
        public _interval_unit_value? _interval_unit { get; set; } = null;

        public enum _interval_unit_value
        {
            /// <summary>
            /// <para>Hours</para>
            /// <para>Hours—The prediction will be calculated for each hour in the range of time described by the Start, End, and Value Interval parameters.</para>
            /// <para>小时—将在“开始”、“结束”和“值间隔”参数描述的时间范围内计算每个小时的预测。</para>
            /// </summary>
            [Description("Hours")]
            [GPEnumValue("HOURS")]
            _HOURS,

            /// <summary>
            /// <para>Days</para>
            /// <para>Days—The prediction will be calculated for each day in the range of time described by the Start, End, and Value Interval parameters.</para>
            /// <para>天数—将在开始、结束和值间隔参数描述的时间范围内计算每天的预测。</para>
            /// </summary>
            [Description("Days")]
            [GPEnumValue("DAYS")]
            _DAYS,

            /// <summary>
            /// <para>Weeks</para>
            /// <para>Weeks—The prediction will be calculated for each week in the range of time described by the Start, End, and Value Interval parameters.</para>
            /// <para>周—将在开始、结束和值间隔参数描述的时间范围内计算每周的预测。</para>
            /// </summary>
            [Description("Weeks")]
            [GPEnumValue("WEEKS")]
            _WEEKS,

            /// <summary>
            /// <para>Months</para>
            /// <para>Months—The prediction will be calculated for each month in the range of time described by the Start, End, and Value Interval parameters.</para>
            /// <para>月—将在开始、结束和值间隔参数描述的时间范围内计算每个月的预测。</para>
            /// </summary>
            [Description("Months")]
            [GPEnumValue("MONTHS")]
            _MONTHS,

            /// <summary>
            /// <para>Years</para>
            /// <para>Years—The prediction will be calculated for each year in the range of time described by the Start, End, and Value Interval parameters.</para>
            /// <para>年—将在开始、结束和值间隔参数描述的时间范围内计算每年的预测。</para>
            /// </summary>
            [Description("Years")]
            [GPEnumValue("YEARS")]
            _YEARS,

        }

        public PredictUsingTrendRaster SetEnv(object cellSize = null, object compression = null, object configKeyword = null, object extent = null, object geographicTransformations = null, object nodata = null, object outputCoordinateSystem = null, object parallelProcessingFactor = null, object pyramid = null, object rasterStatistics = null, object resamplingMethod = null, object scratchWorkspace = null, object snapRaster = null, double[] tileSize = null, object workspace = null)
        {
            base.SetEnv(cellSize: cellSize, compression: compression, configKeyword: configKeyword, extent: extent, geographicTransformations: geographicTransformations, nodata: nodata, outputCoordinateSystem: outputCoordinateSystem, parallelProcessingFactor: parallelProcessingFactor, pyramid: pyramid, rasterStatistics: rasterStatistics, resamplingMethod: resamplingMethod, scratchWorkspace: scratchWorkspace, snapRaster: snapRaster, tileSize: tileSize, workspace: workspace);
            return this;
        }

    }

}